#ifndef PSFDetectorMessenger_h
#define PSFDetectorMessenger_h 1

#include "PSFDetectorConstruction.hh"

#include "G4UImessenger.hh"

class G4UIdirectory;
class G4UIcmdWithABool;
class G4UIcmdWithAString;

class G4UIcmdWithADouble;
class G4UIcmdWithAnInteger;
class G4UIcmdWithADoubleAndUnit;
class G4UIcmdWithoutParameter;
class G4UIcmdWithoutParameter;

class PSFDetectorMessenger : public G4UImessenger
{
public:
  PSFDetectorMessenger(PSFDetectorConstruction *);
  ~PSFDetectorMessenger() override;

  void SetNewValue(G4UIcommand *, G4String) override;

private:
  PSFDetectorConstruction *fDetector = nullptr;

  G4UIdirectory *fDetDir = nullptr;

  G4UIcmdWithAString *fSetPhotonDetGeometryCmd = nullptr;
  G4UIcmdWithAnInteger *fSetNumOfCladLayersCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetPSFLengthCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetPSFCoreRadiusCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetClad1RadiusCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetClad2RadiusCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetPhotonDetHalfLengthCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetGapCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetPhotonDetAlignmentCmd = nullptr;
  G4UIcmdWithADouble *fSetXYRatioCmd = nullptr;
  G4UIcmdWithADouble *fSetSurfaceRoughnessCmd = nullptr;
  G4UIcmdWithADouble *fSetMirrorPolishCmd = nullptr;
  G4UIcmdWithADouble *fSetMirrorReflectivityCmd = nullptr;
  G4UIcmdWithADouble *fSetPhotonDetPolishCmd = nullptr;
  G4UIcmdWithADouble *fSetPhotonDetReflectivityCmd = nullptr;
  G4UIcmdWithABool *fSetMirrorCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetBarLengthCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetBarBaseCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetHoleRadiusCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetCoatingThicknessCmd = nullptr;
  G4UIcmdWithADoubleAndUnit *fSetCoatingRadiusCmd = nullptr;
};

#endif
